package com.atguigu.serviceoss.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.atguigu.serviceoss.properties.OSSProperties;
import com.atguigu.serviceoss.service.OSSService;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.UUID;

/**
 * ClassName: OSSServiceImpl
 * Package: com.atguigu.serviceoss.service.impl
 * Description:
 *
 * @Author 刘强
 * @Create 2024/4/20 8:52
 * @Version 1.0
 */
@Service
public class OSSServiceImpl implements OSSService {

    @Override
    public String fileUpload(MultipartFile file, String dir) {
        // Endpoint以华东1（杭州）为例，其它Region请按实际情况填写。
        String endpoint = OSSProperties.END_POINT;
        // 从环境变量中获取访问凭证。运行本代码示例之前，请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        // 填写Bucket名称，例如examplebucket。
        String bucketName = OSSProperties.BUCKET_NAME;
        // 填写本地文件的完整路径，例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件流。
        //    文件url的例子： https://cdu-srb-test1.oss-cn-chengdu.aliyuncs.com/avatar/ff.jpg
        //    文件url的例子： https://桶名.域名/目录/文件名
        String domainName = OSSProperties.DOMAIN_NAME;  // 域名
        String fileName = file.getOriginalFilename();
        // 填写Object完整路径，完整路径中不能包含Bucket名称，例如exampledir/exampleobject.txt。
        String objectName = dir + new DateTime().toString("/yyyy/MM/dd/")
                + System.currentTimeMillis() + "_" + UUID.randomUUID().toString().substring(0, 6)
                + fileName.substring(fileName.lastIndexOf(".")); //文件扩展名
        String fileUrl = "https://" + bucketName + "." + domainName + "/" + objectName;
        System.out.println("fileUrl = " + fileUrl);
        DefaultCredentialProvider credentialsProvider = CredentialsProviderFactory.newDefaultCredentialProvider
                (OSSProperties.ACCESS_KEY_ID, OSSProperties.SECRET_ACCESS_KEY);

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            InputStream inputStream = file.getInputStream();
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
            // 创建PutObject请求。
            PutObjectResult result = ossClient.putObject(putObjectRequest);
        } catch (Exception ce) {
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }

        return fileUrl;

    }

    @Override
    public void delete(String fileUrl) {
        // Endpoint以华东1（杭州）为例，其它Region请按实际情况填写。
        String endpoint = OSSProperties.END_POINT;
        // 填写Bucket名称，例如examplebucket。
        String bucketName = OSSProperties.BUCKET_NAME;

        // 填写文件所在目录及文件名
        String objectName = fileUrl.substring(("https://" + bucketName + "." + endpoint.substring(8))
                .length()+1);

        // 创建OSSClient实例。
        DefaultCredentialProvider credentialsProvider = CredentialsProviderFactory.newDefaultCredentialProvider
                (OSSProperties.ACCESS_KEY_ID, OSSProperties.SECRET_ACCESS_KEY);
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            // 删除文件或目录。如果要删除目录，目录必须为空。
            ossClient.deleteObject(bucketName, objectName);
        } catch (Exception ce) {
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}
